package stack;

import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * 逆波兰表达式
 * (3+4)*5-6 => 34+5*6-
 * @Auther Jun jie Yi
 * @Date 14:46 2021/7/9
 */
public class PolandNotation {
    public static void main(String[] args) {
        //先定义一个逆波兰表达式
//        String suffixExpression = "3 4 + 5 * 6 -";
        String suffixExpression = "30 4 + 2 *";
        //1.先放到一个 ArrayList 中
        //2.将 ArrayList 传递给一个方法，遍历 ArrayList 配合栈完成计算
        String[] split = suffixExpression.split(" ");
        List<String> rpnList = Arrays.asList(split);
        int res = calculate(rpnList);
        System.out.println(res);
    }

    /**
     * 完成对逆波兰表达式的一个计算 3 4 + 5 * 6 -
     * 1)从左至右扫描，将 3 和 4 压入栈
     * 2)遇到 + 运算符，因此弹出 4 和 3 (4 为栈顶元素，3为次顶元素)，计算出 3 + 7 的值，得 7，再将 7 入栈
     */
    public static int calculate(List<String> ls) {
        Stack<String> stack = new Stack<>();
        for (String e : ls) {
            //匹配的是多位数
            if(e.matches("\\d+")){
                //入栈
                stack.push(e);
            } else {
                //pop出两个数，并进行运算
                int num1 = Integer.parseInt(stack.pop());
                int num2 = Integer.parseInt(stack.pop());
                int res;
                if(e.equals("+")) {
                    res = num1 + num2;
                } else if(e.equals("-")) {
                    res = num2 - num1;
                } else if(e.equals("*")) {
                    res = num1 * num2;
                } else if(e.equals("/")) {
                    res = num2 / num1;
                }  else {
                    throw new RuntimeException("运算符有误！");
                }
                //将结果入栈
                stack.push(String.valueOf(res));
            }
        }
        //最后留在栈里面的就是结果
        return Integer.parseInt(stack.pop());
    }
}
